package org.example.scoresystem_backen.mapper;

import org.apache.ibatis.annotations.Mapper;
import org.apache.ibatis.annotations.Param;
import org.example.scoresystem_backen.entity.Student;
import org.example.scoresystem_backen.dto.StudentWithClassDTO;

import java.util.List;

/**
 * 学生数据访问Mapper接口
 */
@Mapper
public interface StudentMapper {
    
    /**
     * 根据ID查找学生
     * @param id 学生ID
     * @return 学生信息
     */
    Student findById(@Param("id") Integer id);
    
    /**
     * 查找所有学生
     * @return 学生列表
     */
    List<Student> findAll();
    
    /**
     * 根据学号查找学生
     * @param sno 学号
     * @return 学生信息
     */
    Student findBySno(@Param("sno") String sno);
    
    /**
     * 根据学号和密码查找学生（用于登录验证）
     * @param sno 学号
     * @param password 密码
     * @return 学生信息
     */
    Student findBySnoAndPassword(@Param("sno") String sno, @Param("password") String password);
    
    /**
     * 根据班级ID查找学生列表
     * @param classId 班级ID
     * @return 学生列表
     */
    List<Student> findByClassId(@Param("classId") Integer classId);
    
    /**
     * 根据姓名查找学生列表
     * @param name 姓名
     * @return 学生列表
     */
    List<Student> findByName(@Param("name") String name);
    
    /**
     * 检查学号是否存在
     * @param sno 学号
     * @return 是否存在
     */
    boolean existsBySno(@Param("sno") String sno);
    
    /**
     * 根据姓名模糊查询学生
     * @param name 姓名关键字
     * @return 学生列表
     */
    List<Student> findByNameContaining(@Param("name") String name);
    
    /**
     * 根据学号模糊查询学生
     * @param sno 学号关键字
     * @return 学生列表
     */
    List<Student> findBySnoContaining(@Param("sno") String sno);
    
    /**
     * 统计班级学生数量
     * @param classId 班级ID
     * @return 学生数量
     */
    Long countByClassId(@Param("classId") Integer classId);
    
    /**
     * 插入学生
     * @param student 学生信息
     * @return 影响行数
     */
    int insert(Student student);
    
    /**
     * 更新学生信息
     * @param student 学生信息
     * @return 影响行数
     */
    int update(Student student);
    
    /**
     * 根据ID删除学生
     * @param id 学生ID
     * @return 影响行数
     */
    int deleteById(@Param("id") Integer id);

    /**
     * 根据班级ID删除学生
     * @param classId 班级ID
     * @return 影响行数
     */
    int deleteByClassId(@Param("classId") Integer classId);

    /**
     * 统计学生总数
     * @return 学生总数
     */
    Long count();

    /**
     * 分页查询学生（包含班级信息）
     * @param search 搜索关键词（学号或姓名）
     * @param classId 班级ID过滤
     * @param offset 偏移量
     * @param limit 限制条数
     * @return 学生列表（包含班级信息）
     */
    List<StudentWithClassDTO> findStudentsWithClassByPage(
        @Param("search") String search,
        @Param("classId") Integer classId,
        @Param("offset") Integer offset,
        @Param("limit") Integer limit
    );

    /**
     * 统计学生总数（支持搜索和过滤）
     * @param search 搜索关键词（学号或姓名）
     * @param classId 班级ID过滤
     * @return 学生总数
     */
    Long countStudentsWithFilter(
        @Param("search") String search,
        @Param("classId") Integer classId
    );
}
